#include "tcpclient.h"
#include "ui_tcpclient.h"
#include "opewidget.h"
#include "privatechat.h"
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include <QByteArray>
#include <QHostAddress>
#include <QJsonObject>
#include <QJsonDocument>
TcpClient::TcpClient(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::TcpClient)
{
    ui->setupUi(this);
    loadConfig();
    connect(&m_tcpSocket, SIGNAL(connected()), this , SLOT(showConnect()));
    connect(&m_tcpSocket, SIGNAL(readyRead()), this , SLOT(recvMsg()));
    m_tcpSocket.connectToHost(QHostAddress(m_strIP), m_usPort);
}

TcpClient::~TcpClient()
{
    delete ui;
}

void TcpClient::loadConfig()
{
    //定义文件名
    QFile file(":/client.config");
    //打开文件（只读方式）
    if(file.open(QIODevice::ReadOnly)) {
        //读取字符串
        QByteArray baData = file.readAll();
        //转换成字符串
        QString strData = baData.toStdString().c_str();
        file.close();
        //可以替换使用空格分割，也可以直接使用\r\n分割
        //strData.replace("\r\n"," ");
        QStringList strList = strData.split("\r\n");
        //读取分割的数据
        m_strIP = strList.at(0);
        m_usPort = strList.at(1).toUShort();
        qDebug()<<"ip:"<<m_strIP<<"port:"<<m_usPort;
    }else{
        QMessageBox::critical(this, "open config", "open config failed");
    }
}

TcpClient &TcpClient::getInstance()
{
    static TcpClient instance;
    return instance;
}

QTcpSocket &TcpClient::getTcpSocket(){
    return m_tcpSocket;
}

QString TcpClient::getloginName()
{
    return m_strLoginName;
}

QString TcpClient::getCurPath()
{
    return m_strCurPath;
}

void TcpClient::setCurPath(QString strNewCurPath)
{
    m_strCurPath = strNewCurPath;
}

void TcpClient::recvMsg()
{
    //读取数据
    QByteArray data = m_tcpSocket.readAll();
    qDebug() << "Received data:" << data;
    // 解析JSON
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(data, &error);
    if (error.error != QJsonParseError::NoError) {
        qDebug() << "JSON parse error:" << error.errorString();
        return;
    }
    if(!doc.isObject()){
        qDebug() << "doc isn't a Object";
        return;
    }
    QJsonObject jsonObj = doc.object();
    QString type = jsonObj["msgType"].toString();
    if(type == "REGISTER"){
        int code = jsonObj["code"].toInt();
        QString msg = jsonObj["msg"].toString();
        switch(code){
            case 200 :{
                qDebug() << "200:" << msg;
                break;
            }
            case 400 :{
                qDebug() << "200:" << msg;
                break;
            }
            case 404 :{
                qDebug() << "找不到对应的请求！";
                break;
            }
        }
    }
    // if(OpeWidget::getInstance().getBook()->getDownloadStatus())
    // {
    //     QByteArray buffer = m_tcpSocket.readAll();
    //     m_file.write(buffer);
    //     Book *pBook = OpeWidget::getInstance().getBook();
    //     pBook->m_iRecived += buffer.size();
    //     if(pBook->m_iTol == pBook->m_iRecived){
    //         m_file.close();
    //         pBook->m_iTol = 0;
    //         pBook->m_iRecived = 0;
    //         pBook->setDownloadStatus(false);
    //     }
    //     else if(pBook->m_iTol < pBook->m_iRecived)
    //     {
    //         m_file.close();
    //         pBook->m_iTol = 0;
    //         pBook->m_iRecived = 0;
    //         pBook->setDownloadStatus(false);
    //         QMessageBox::critical(this,"下载文件","下载文件失败");
    //     }
    // }
    // else
    // {
    //     qDebug() << m_tcpSocket.bytesAvailable();
    //     uint uiPDULen = 0;
    //     m_tcpSocket.read((char*)&uiPDULen, sizeof(uint));
    //     uint uiMsgLen = uiPDULen-sizeof(PDU);
    //     PDU *pdu = mkPDU(uiMsgLen);
    //     m_tcpSocket.read((char*)pdu + sizeof(uint),uiPDULen-sizeof(uint));
    //     //qDebug()<<pdu->caData;
    //     switch(pdu->uiMsgType){
    //     case ENUM_MSG_TYPE_REGIST_RESPOND:{
    //         if(0 == strcmp(pdu->caData, REGIST_OK)){
    //             QMessageBox::information(this,"注册",REGIST_OK);
    //         }else if(0 == strcmp(pdu->caData, REGIST_FALIED)){
    //             QMessageBox::warning(this,"注册",REGIST_FALIED);
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_LOGIN_RESPOND:{
    //         if(0 == strcmp(pdu->caData, LOGIN_OK)){
    //             m_strCurPath = QString("%1").arg(m_strLoginName);
    //             QMessageBox::information(this,"登录",LOGIN_OK);
    //             OpeWidget::getInstance().setWindowTitle(m_strLoginName);
    //             OpeWidget::getInstance().show();
    //             this->hide();
    //         }else if(0 == strcmp(pdu->caData, LOGIN_FALIED)){
    //             QMessageBox::warning(this,"登录",LOGIN_FALIED);
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ALL_ONLINE_RESPOND:{
    //         OpeWidget::getInstance().getFriend()->showAllOnlineUsr(pdu);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_SERACH_USR_RESPOND:{
    //         qDebug()<<pdu->caData;
    //         if(0 == strcmp(SEARCH_USR_NO, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString("%1:not exist").arg(OpeWidget::getInstance().getFriend()->m_strSearchName));
    //         }
    //         else if(0 == strcmp(SEARCH_USR_ONLINE, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString("%1:Online").arg(OpeWidget::getInstance().getFriend()->m_strSearchName));
    //         }
    //         else if(0 == strcmp(SEARCH_USR_OFFLINE, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString("%1:Offline").arg(OpeWidget::getInstance().getFriend()->m_strSearchName));
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ADD_FRIEND_RESPOND:{
    //         QMessageBox::information(this, "添加好友", pdu->caData);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ADD_FRIEND_REQUEST:
    //     {
    //         qDebug()<<"转发成功！";
    //         char caName[CADATEMAX] = {'\0'};
    //         strncpy(caName, pdu->caData + CADATEMAX, CADATEMAX);
    //         int ret = QMessageBox::information(this, "添加好友", QString("%1 want to add  you as friend?").arg(caName), QMessageBox::Yes, QMessageBox::No);
    //         PDU *respdu = mkPDU(0);
    //         memcpy(respdu->caData, pdu->caData, CADATEMAX*2);
    //         //memcpy(respdu->caData + 32, pdu->caData + 32, 32);
    //         if(QMessageBox::Yes == ret){
    //             respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_AGREE;
    //         }else{
    //             respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_REFUSE;
    //         }
    //         m_tcpSocket.write((char*)respdu, respdu->uiPDULen);
    //         free(respdu);
    //         respdu = NULL;
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ADD_FRIEND_AGREE:
    //     {
    //         QMessageBox::information(this, "添加好友", pdu->caData);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ADD_FRIEND_REFUSE:
    //     {
    //         char percaName[CADATEMAX] = {'\0'};
    //         strncpy(percaName, pdu->caData, CADATEMAX);
    //         QMessageBox::information(this, "添加好友", QString("%1 refuse to add you as friend").arg(percaName));
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_FLUSH_FRIEND_RESPOND:
    //     {
    //         OpeWidget::getInstance().getFriend()->UpdateFriendList(pdu);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_DELETE_FRIEND_RESPOND :
    //     {
    //         if(0 == strcmp(DELETE_FALURE, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString(DELETE_FALURE));
    //         }
    //         if(0 == strcmp(DELETE_SUCCESSFUL, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString(DELETE_SUCCESSFUL));
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST:
    //     {
    //         char caName[CADATEMAX] = {'\0'};
    //         strncpy(caName, pdu->caData + CADATEMAX, CADATEMAX);
    //         char sendName[CADATEMAX] = {'\0'};
    //         strncpy(sendName, pdu->caData, CADATEMAX);
    //         PrivateChat::getInstance().setChatName(QString(sendName));
    //         if(PrivateChat::getInstance().isHidden())
    //         {
    //             PrivateChat::getInstance().show();
    //         }
    //         PrivateChat::getInstance().updateMsg(pdu);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_GROUP_CHAT_REQUEST:
    //     {
    //         OpeWidget::getInstance().getFriend()->UpdateGroupMsg(pdu);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_CREATE_DIR_RESPOND:
    //     {
    //         if(0 == strcmp(CREATE_DIR_SUCCESSFUL, pdu->caData))
    //         {
    //             QMessageBox::information(this, "搜索", QString(CREATE_DIR_SUCCESSFUL));
    //         }
    //         else{
    //             QMessageBox::information(this, "搜索", QString(pdu->caData));
    //         }
    //         OpeWidget::getInstance().getBook()->flushFile();
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_FLUSH_FILE_RESPOND :
    //     {
    //         OpeWidget::getInstance().getBook()->updateFileList(pdu);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_DELETE_DIR_RESPOND :
    //     {
    //         QMessageBox::information(this,"删除文件",pdu->caData);
    //         OpeWidget::getInstance().getBook()->flushFile();
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_RENAME_DIR_RESPOND :
    //     {
    //         QMessageBox::information(this,"重命名",pdu->caData);
    //         OpeWidget::getInstance().getBook()->flushFile();
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_ENTER_DIR_RESPOND :
    //     {
    //         if(0 == qstrncmp(ENTER_DIR_OK, pdu->caData,CADATEMAX))
    //         {
    //             //QMessageBox::information(this, "进入文件夹", ENTER_DIR_OK);
    //             TcpClient::getInstance().m_strCurPath = QString("%1/%2").arg(m_strCurPath).arg(pdu->caData + 32);
    //             //qDebug()<<TcpClient::getInstance().m_strCurPath;
    //             OpeWidget::getInstance().getBook()->flushFile();
    //         }
    //         else if(0 == qstrncmp(ENTER_DIR_FAILED, pdu->caData,CADATEMAX)){
    //             QMessageBox::warning(this, "进入文件夹", ENTER_DIR_FAILED);
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_UPLOAD_DIR_RESPOND:
    //     {
    //         if(0 == qstrncmp(UPLOAD_DIR_CREATE_OK, pdu->caData,CADATEMAX))
    //         {
    //             //QMessageBox::information(this, "上传文件", QString(UPLOAD_DIR_CREATE_OK));
    //             OpeWidget::getInstance().getBook()->uploadFileData();
    //         }
    //         else if (0 == qstrncmp(UPLOAD_DIR_CREATE_FAILED, pdu->caData,CADATEMAX)){
    //             QMessageBox::warning(this, "上传文件", UPLOAD_DIR_CREATE_FAILED);
    //         }
    //         else if (0 == qstrncmp(UPLOAD_DIR_PROGRESS, pdu->caData,CADATEMAX)){
    //             //QMessageBox::information(this, "上传文件", UPLOAD_DIR_PROGRESS);
    //             // char isRecved[CADATEMAX] = {'\0'};
    //             // memcpy(isRecved, pdu->caData + CADATEMAX,CADATEMAX);
    //             // QString str = QString::fromUtf8(isRecved).trimmed();  // 去掉尾部空格
    //             // bool ok = false;
    //             // qint64 value = str.toLongLong(&ok);
    //             // qDebug()<<value;
    //             //OpeWidget::getInstance().getBook()->showUploadFileDataProgress(value);
    //         }
    //         else if (0 == qstrncmp(UPLOAD_DIR_FINISHED, pdu->caData,CADATEMAX)){
    //             //OpeWidget::getInstance().getBook()->hideBar();
    //             QMessageBox::information(this, "上传文件", UPLOAD_DIR_FINISHED);
    //             OpeWidget::getInstance().getBook()->flushFile();
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_DELETE_FILE_RESPOND :
    //     {
    //         QMessageBox::information(this,"删除文件",pdu->caData);
    //         OpeWidget::getInstance().getBook()->flushFile();
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_DOWNLOAD_DIR_RESPOND :
    //     {
    //         char caFileName[CADATEMAX] = {'\0'};
    //         sscanf(pdu->caData,"%s %lld",caFileName, &(OpeWidget::getInstance().getBook()->m_iTol));
    //         if(strlen(caFileName) > 0 && OpeWidget::getInstance().getBook()->m_iTol > 0)
    //         {
    //             OpeWidget::getInstance().getBook()->setDownloadStatus(true);
    //             m_file.setFileName(OpeWidget::getInstance().getBook()->m_strSaveFilePath);
    //             if(!m_file.open(QIODevice::WriteOnly)){
    //                 QMessageBox::warning(this,"下载文件","获得保存文件路径失败");
    //             }
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_SHARE_FILE_RESPOND:
    //     {
    //         QMessageBox::information(this ,"共享文件" ,pdu->caData);
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_SHARE_FILE_NOTE:
    //     {
    //         char *pPath = new char[pdu->uiMsgLen];
    //         memcpy(pPath, pdu->caMsg, pdu->uiMsgLen);
    //         char *pos = strrchr(pPath,'/');
    //         if(NULL != pos)
    //         {
    //             pos++;
    //             QString strNote = QString("%1 share file->%2 \n Do you accept?").arg(pdu->caData).arg(pos);
    //             int ret  = QMessageBox::question(this ,"共享文件" ,strNote);
    //             if(ret == QMessageBox::Yes)
    //             {
    //                 PDU* respdu = mkPDU(pdu->uiMsgLen);
    //                 respdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND;
    //                 memcpy(respdu->caMsg, pdu->caMsg, pdu->uiMsgLen);
    //                 strcpy(respdu->caData,TcpClient::getInstance().getloginName().toStdString().c_str());
    //                 m_tcpSocket.write((char*)respdu, respdu->uiPDULen);
    //                 free(respdu);
    //                 respdu = NULL;
    //             }
    //         }
    //         break;
    //     }
    //     case ENUM_MSG_TYPE_MOVE_FILE_RESPOND:
    //     {
    //         QMessageBox::information(this ,"移动文件" ,pdu->caData);
    //         break;
    //     }
    //     default:
    //         break;
    //     }
    //     free(pdu);
    //     pdu=NULL;
    // }
}

void TcpClient::showConnect()
{
    QMessageBox::information(this, "连接服务器","连接服务器成功");
}

// void TcpClient::on_send_pd_clicked()
// {
//     QString strMsg = ui->name_le->text();
//     if(!strMsg.isEmpty()){
//         PDU * pdu = mkPDU(strMsg.size());
//         pdu->uiMsgType = 888;
//         memcpy(pdu->caMsg, strMsg.toStdString().c_str(),strMsg.size());
//         m_tcpSocket.write((char*)pdu, pdu->uiPDULen);
//         free(pdu);
//         pdu=NULL;

//     }else{
//         QMessageBox::warning(this,"信息发送","发送信息不能为空");
//     }
// }


void TcpClient::on_login_pd_clicked()
{
    QString strName = ui->name_le->text();
    QString strPwd = ui->pwd_le->text();
    if(!strName.isEmpty() && !strPwd.isEmpty()){
        m_strLoginName = strName;
        PDU *pdu = mkPDU(0);
        pdu->uiMsgType = MSGTYPE::LOGINER;
        strncpy(pdu->caData, strName.toStdString().c_str(),CADATEMAX);
        strncpy(pdu->caData + CADATEMAX, strPwd.toStdString().c_str(),CADATEMAX);
        m_tcpSocket.write((char*)pdu, pdu->uiPDULen);
        free(pdu);
        pdu=NULL;
    }else{
        QMessageBox::warning(this,"登录","用户名和密码不能为空");
    }

}


void TcpClient::on_register_pd_clicked()
{
    QString strName = ui->name_le->text();
    QString strPwd = ui->pwd_le->text();
    qDebug()<<"strName:"<<strName<<"strPwd:"<<strPwd;

    if(!strName.isEmpty() && !strPwd.isEmpty()){
        QJsonObject obj;
        obj["msgType"] = "REGISTER";
        obj["username"] = strName;
        obj["password"]  = strPwd;
        QJsonDocument doc(obj);
        m_tcpSocket.write(doc.toJson());
        qDebug()<<"发送登陆请求信息成功！";
    }else{
        QMessageBox::warning(this,"注册","用户名和密码不能为空");
    }
}


void TcpClient::on_cancel_pd_clicked()
{
    // QString strName = ui->name_le->text();
    // QString strPwd = ui->pwd_le->text();
    // if(!strName.isEmpty() && !strPwd.isEmpty()){
    //     PDU *pdu = mkPDU(0);
    //     pdu->uiMsgType = ENUM_MSG_TYPE_REGIST_REQUEST;
    //     strncpy(pdu->caData, strName.toStdString().c_str(),32);
    //     strncpy(pdu->caData + 32, strPwd.toStdString().c_str(),32);
    //     m_tcpSocket.write((char*)pdu, pdu->uiPDULen);
    //     free(pdu);
    //     pdu=NULL;
    // }else{
    //     QMessageBox::warning(this,"注销","用户名和密码不能为空");
    // }
}

